package com.sunday.common.netty.e5_Udp.server;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.socket.DatagramPacket;
import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class UdpServerHandler extends SimpleChannelInboundHandler<DatagramPacket> {
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket dp) throws Exception {
        String content = dp.content().toString(CharsetUtil.UTF_8);
        log.info("Get message from client {}, msg: {}", ctx.channel().id(), content);

        /**
         * Unpooled.copiedBuffer 和 Unpooled.buffer 是 Netty 提供的用于创建 ByteBuf 的方法。
         * Unpooled.copiedBuffer 会创建一个新的 ByteBuf，并将传入的字节数组的副本拷贝进去，修改原数组不会影响新创建的 ByteBuf。
         * Unpooled.buffer 则会创建一个新的未初始化的 ByteBuf。这意味着你需要手动设置这个 ByteBuf 的内容，通常使用这个方法创建的 ByteBuf 需要手动写入数据。
         */
        // Unpooled.copiedBuffer -> 创建一个新的缓冲区，其内容是指定数组的副本。
        ctx.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer("Response " + content, CharsetUtil.UTF_8),
                dp.sender()));
    }

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        log.info("Channel {} active.", ctx.channel().id());
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { // (4)
        // Close the connection when an exception is raised.
        cause.printStackTrace();
        ctx.close();
    }
}